package com.gitee.zhanyao.common.util;

import lombok.extern.slf4j.Slf4j;

import javax.validation.constraints.NotNull;
import java.util.regex.Pattern;

/**
 * 用于校验规则
 */
@Slf4j
public class ValidateUtil {

    private ValidateUtil() {
    }

    /**
     * 判断是否身份证号码
     * 校验规则：
     * 身份证号码共18位，由17位本体码和1位校验码组成。
     * 前6位是地址码，表示登记户口时所在地的行政区划代码，依照《中华人民共和国行政区划代码》国家标准（GB/T2260）的规定执行；
     * 7到14位是出生年月日，采用YYYYMMDD格式；
     * 15到17位是顺序码，表示在同一地址码所标识的区域范围内，对同年、同月、同日出生的人编订的顺序号，顺序码的奇数分配给男性，偶数分配给女性，即第17位奇数表示男性，偶数表示女性；
     * 第18位是校验码，采用ISO 7064:1983, MOD 11-2校验字符系统
     * <p>
     * 15位身份证自2013年1月1日起停止使用，所以不再考虑15位身份证的情况
     *
     * @param cardNo 非空字符串
     * @return 布尔值
     */
    public static boolean isIdCard(@NotNull String cardNo) {
        if (cardNo.length() != 18) {
            log.info("[{}] 不是18位的身份证号", cardNo);
            return false;
        }

        Integer[] factorArr = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1};
        String[] parityBit = {"1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"};
        cardNo = cardNo.toUpperCase();
        // TODO

        return true;
    }

    /**
     * 判断是否为日期
     *
     * @param date 参入格式为：yyyyMMdd
     * @return 布尔值
     */
    public static boolean isDate(String date) {
        if (date.length() != 8) {
            return false;
        }
        Integer[] monthDays = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int year = Integer.parseInt(date.substring(0, 4));
        int month = Integer.parseInt(date.substring(4, 6));
        int day = Integer.parseInt(date.substring(6, 8));
        if (!Pattern.matches("\\d{4}", String.valueOf(year))) {
            return false;
        }
        if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) {
            // 闰年
            monthDays[1] = 29;
        }
        return ((month >= 1 && month <= 12) && (day == monthDays[month - 1]));
    }

    /**
     * 验证是否为非负整数
     *
     * @param value
     * @return 布尔值
     */
    public static boolean isDigits(String value) {
        String pattern = "^[0-9]*$";
        return Pattern.matches(pattern, value);
    }

}
